package facade;

import AgendaColaborativa.AgendaColaborativa;
import exceptions.AmigoJaAdicionadoException;
import exceptions.AtributoNaoPreenchidoException;
import exceptions.EventoInexistenteException;
import exceptions.LoginInvalidoException;
import exceptions.SenhaInvalidaException;
import exceptions.UsuarioJaExisteException;
import exceptions.UsuarioNaoAmigoException;
import exceptions.UsuarioNaoCadastradoException;
import exceptions.UsuarioNaoDonoException;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;

/**
 * Fachada do projeto agenda colaborativa
 * @author Everton de Oliveira & Robson Medeiros
 */
public class Facade {

    private AgendaColaborativa facade;

    //contrutor da fachada
    public Facade() {
        this.facade = new AgendaColaborativa();
    }

    /**
     *
     * @param login
     * @return String
     * @throws LoginInvalidoException
     * @throws UsuarioNaoCadastradoException
     */
    public String getNomeUsuario(String login) throws LoginInvalidoException, UsuarioNaoCadastradoException {
        return this.facade.getNomeUsuario(login);
    }

    /**
     *
     * @param login
     * @param senha
     * @param nome
     * @throws SenhaInvalidaException
     * @throws UsuarioJaExisteException
     * @throws LoginInvalidoException
     */
    public void criarUsuario(String login, String senha, String nome) throws SenhaInvalidaException, UsuarioJaExisteException, LoginInvalidoException {
        this.facade.criarUsuario(login, senha, nome);
    }

    /**
     *
     * @param login
     * @return boolean
     */
    public boolean contemUsuario(String login) {
        return this.facade.contemUsuario(login);
    }

    /**
     * limpa fachada - clear
     */
    public void limpaSistema() {
        this.facade.limpaSistema();
    }

    /**
     *
     * @param login
     * @param senha
     * @return String
     * @throws AtributoNaoPreenchidoException
     * @throws UsuarioNaoCadastradoException
     */
    public String getDescricao(String login, String senha) throws AtributoNaoPreenchidoException, UsuarioNaoCadastradoException {
        return this.facade.getDescricao(login, senha);
    }

    /**
     *
     * @param login
     * @param senha
     * @return String
     * @throws AtributoNaoPreenchidoException
     * @throws UsuarioNaoCadastradoException
     */
    public String getEstadoCivil(String login, String senha) throws AtributoNaoPreenchidoException, UsuarioNaoCadastradoException {
        return this.facade.getEstadoCivil(login, senha);
    }

    /**
     *
     * @param login
     * @param senha
     * @return String
     * @throws AtributoNaoPreenchidoException
     * @throws UsuarioNaoCadastradoException
     */
    public String getAniversario(String login, String senha) throws AtributoNaoPreenchidoException, UsuarioNaoCadastradoException {
        return this.facade.getAniversario(login, senha);
    }

    /**
     *
     * @param login
     * @param senha
     * @return String
     * @throws AtributoNaoPreenchidoException
     */
    public String getCidadeNatal(String login, String senha) throws AtributoNaoPreenchidoException, UsuarioNaoCadastradoException {
        return this.facade.getCidadeNatal(login, senha);
    }

    /**
     *
     * @param login
     * @param senha
     * @param descricao
     * @throws SenhaInvalidaException
     */
    public void editarDescricao(String login, String senha, String descricao) throws SenhaInvalidaException {
        this.facade.editarDescricao(login, senha, descricao);
    }

    /**
     *
     * @param login
     * @param senha
     * @param novoEstadoCivil
     * @throws SenhaInvalidaException
     */
    public void editarEstadoCivil(String login, String senha, String novoEstadoCivil) throws SenhaInvalidaException {
        this.facade.editarEstadoCivil(login, senha, novoEstadoCivil);
    }

    /**
     *
     * @param login
     * @param senha
     * @param novoAniversario
     * @throws SenhaInvalidaException
     */
    public void editarAniversario(String login, String senha, Date novoAniversario) throws SenhaInvalidaException {
        this.facade.editarAniversario(login, senha, novoAniversario);
    }

    /**
     *
     * @param login
     * @param senha
     * @param novaCidadeNatal
     * @throws SenhaInvalidaException
     */
    public void editarCidadeNatal(String login, String senha, String novaCidadeNatal) throws SenhaInvalidaException {
        this.facade.editarCidadeNatal(login, senha, novaCidadeNatal);
    }

    /**
     *
     * @param login
     * @param amigo
     * @return boolean
     */
    public boolean ehAmigo(String login, String amigo) {
        return this.facade.ehAmigo(login, amigo);
    }

    /**
     * adiciona amigo
     * @param id
     * @param amigo
     * @throws AmigoJaAdicionadoException
     * @throws UsuarioNaoCadastradoException
     */
    public void adicionarAmigo(String id, String amigo) throws AmigoJaAdicionadoException, UsuarioNaoCadastradoException {
        this.facade.adicionarAmigo(id, amigo);
    }

    /**
     *
     * @param login
     * @return String
     */
    public String getAmigos(String login) {
        return this.facade.getAmigos(login);
    }

    /**
     *
     * @param dono
     * @param titulo
     * @param data
     * @param local
     * @return Integer
     * @throws LoginInvalidoException
     * @throws UsuarioNaoCadastradoException
     */
    public Integer criarEvento(String dono, String titulo, String data, String local) throws LoginInvalidoException, UsuarioNaoCadastradoException, ParseException {
        return this.facade.criarEvento(dono, titulo, data, local);
    }

    /**
     *
     * @param idEvento
     * @return String
     */
    public String getDataEvento(Integer idEvento) throws EventoInexistenteException {
        return this.facade.getDataEvento(idEvento);
    }

    /**
     *
     * @param idEvento
     * @return String
     */
    public String getTituloEvento(Integer idEvento) throws EventoInexistenteException {
        return this.facade.getTituloEvento(idEvento);
    }

    /**
     *
     * @param idEvento
     * @return String
     */
    public String getLocalEvento(Integer idEvento) throws EventoInexistenteException {
        return this.facade.getLocalEvento(idEvento);
    }

    /**
     *
     * @param usuarioAdicionador
     * @param idEvento
     * @param participante
     * @throws UsuarioNaoDonoException
     * @throws UsuarioNaoAmigoException
     * @throws LoginInvalidoException
     * @throws UsuarioNaoCadastradoException
     */
    public void adicionarParticipante(String usuarioAdicionador, Integer idEvento, String participante) throws UsuarioNaoDonoException, UsuarioNaoAmigoException, LoginInvalidoException, UsuarioNaoCadastradoException {
        this.facade.adicionarParticipante(usuarioAdicionador, idEvento, participante);
    }

    /**
     *
     * @param idEvento
     * @return String
     */
    public String getParticipantesEvento(Integer idEvento) {
        return this.facade.getParticipantesEvento(idEvento);
    }

    /**
     *
     * @param idEvento
     * @return String
     */
    public String getDonoEvento(Integer idEvento) {
        return this.facade.getDonoEvento(idEvento);
    }

    /**
     *
     * @param login
     * @return String
     */
    public String getEventosUsuarioEhDono(String login) {
        return this.facade.getEventosUsuarioEhDono(login);
    }

    /**
     *
     * @param login
     * @param idEvento
     * @return boolean
     */
    public boolean ehDono(String login, Integer idEvento) {
        return this.facade.ehDono(login, idEvento);
    }

    /**
     *
     * @param evento
     * @param dono
     * @throws UsuarioNaoCadastradoException
     * @throws UsuarioNaoDonoException
     * @throws EventoInexistenteException
     */
    public void removerEvento(Integer evento, String dono) throws UsuarioNaoCadastradoException, UsuarioNaoDonoException, EventoInexistenteException{
        this.facade.removerEvento(evento, dono);
    }

    /**
     * 
     * @param id
     * @return
     */
    public String getEventosUsuarioParticipa(String id){
        return this.facade.getEventosUsuarioParticipa(id);
    }

    /**
     * limpa fachada(clear) e mantem persistencia.
     */
    public void encerraSistema() throws IOException{
        this.facade.encerraSistema();
    }

    /**
     * inicia sistema mantendo persistencia.
     */
    public void iniciaSistema() throws ClassNotFoundException, IOException{
        this.facade.iniciaSistema();
    }
}
